import { MESSAGE_TYPES, createResponse } from '../render/types/messages.js'

// 引入日志
import { logger } from './logger.js'

// 引入登录
import { getUser, getDeviceId } from '../render/components/login/auth.js'

logger.info('🚀 Background 脚本已启动')
getUser().then(async (user) => {
  const deviceId = await getDeviceId()
  logger.info('🚀 登录用户信息:', {
    user,
    deviceId,
    token: user?.token,
    loginTime: user?.loginTime,
    lastVerifyTime: user?.lastVerifyTime,
    strategy: user?.strategy,
  })
})

// 追踪打开的页面
let optionsTabId = null

/**
 * 统一的错误处理函数
 * @param {Error} error - 错误对象
 * @param {string} context - 错误上下文
 * @param {function} sendResponse - 响应函数
 */
function handleError(error, context, sendResponse) {
  logger.error(`${context}错误:`, error)
  if (sendResponse) {
    sendResponse(createResponse(false, null, `${context}错误: ${error.message}`))
  }
}

// 监听消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  try {
    logger.debug('收到消息:', request)

    switch (request.type) {
      // 打开侧边栏（Chrome API 不支持程序化关闭）
      case MESSAGE_TYPES.OPEN_SIDEPANEL:
        logger.info('处理打开侧边栏请求')
        chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
          try {
            if (tabs[0]) {
              chrome.sidePanel.open({ tabId: tabs[0].id })
              logger.info('侧边栏已打开', { tabId: tabs[0].id })
              sendResponse(createResponse(true, null, '侧边栏已打开'))
            } else {
              logger.warn('未找到活动标签页')
              sendResponse(createResponse(false, null, '未找到活动标签页'))
            }
          } catch (error) {
            handleError(error, '打开侧边栏', sendResponse)
          }
        })
        return true // 保持消息通道开放

      // 打开/关闭设置页面
      case MESSAGE_TYPES.TOGGLE_OPTIONS:
        logger.info('处理设置页面切换请求')
        if (optionsTabId !== null) {
          // 检查标签页是否还存在
          chrome.tabs.get(optionsTabId, (tab) => {
            if (chrome.runtime.lastError || !tab) {
              // 标签页不存在，打开新的
              chrome.runtime.openOptionsPage(() => {
                chrome.tabs.query(
                  { url: chrome.runtime.getURL('src/render/views/options/options.html') },
                  (tabs) => {
                    if (tabs[0]) {
                      optionsTabId = tabs[0].id
                      logger.info('设置页面已打开', { tabId: optionsTabId })
                    }
                  },
                )
              })
              sendResponse(createResponse(true, null, '设置页面已打开'))
            } else {
              // 标签页存在，关闭它
              chrome.tabs.remove(optionsTabId, () => {
                logger.info('设置页面已关闭', { tabId: optionsTabId })
                optionsTabId = null
                sendResponse(createResponse(true, null, '设置页面已关闭'))
              })
            }
          })
        } else {
          // 打开新的设置页面
          chrome.runtime.openOptionsPage(() => {
            chrome.tabs.query(
              { url: chrome.runtime.getURL('src/render/views/options/options.html') },
              (tabs) => {
                if (tabs[0]) {
                  optionsTabId = tabs[0].id
                  logger.info('设置页面已打开', { tabId: optionsTabId })
                  sendResponse(createResponse(true, null, '设置页面已打开'))
                }
              },
            )
          })
        }
        return true // 保持消息通道开放

      // 发布文章
      case MESSAGE_TYPES.PUBLISH_ARTICLE: {
        const reqMessage = request.message
        logger.info('处理发布文章请求', { traceId: reqMessage?.traceId })

        if (reqMessage?.action === MESSAGE_TYPES.PUBLISH_ARTICLE) {
          // 发送响应
          sendResponse(
            createResponse(
              true,
              reqMessage.data,
              '插件收到了发布文章请求，正在执行',
              reqMessage.traceId,
            ),
          )

          // 打开新标签页并打开侧边栏
          chrome.tabs.create(
            {
              url: 'https://mp.weixin.qq.com',
              active: true,
            },
            (tab) => {
              try {
                chrome.sidePanel.open({ tabId: tab.id })
                logger.info('已打开微信公众号页面并打开侧边栏', { tabId: tab.id })
              } catch (error) {
                logger.error('打开侧边栏失败:', error)
              }
            },
          )
        } else {
          logger.warn('未知的发布文章动作', { action: reqMessage?.action })
          sendResponse(
            createResponse(
              false,
              null,
              `未知的发布文章动作: ${reqMessage?.action}`,
              reqMessage?.traceId,
            ),
          )
        }
        break
      }

      default:
        logger.warn('未知的消息类型', { type: request.type })
        sendResponse(createResponse(false, null, `未知的消息类型: ${request.type}`))
        break
    }
  } catch (error) {
    handleError(error, '消息处理', sendResponse)
  }

  return false // 同步响应
})

// 监听标签页关闭事件，清理追踪
chrome.tabs.onRemoved.addListener((tabId) => {
  if (tabId === optionsTabId) {
    logger.info('设置页面标签已关闭', { tabId })
    optionsTabId = null
  }
})

// 监听扩展安装事件
chrome.runtime.onInstalled.addListener((details) => {
  logger.info('扩展已安装/更新', {
    reason: details.reason,
    version: chrome.runtime.getManifest().version,
  })
  chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: false })
})
